Вы - -й посетитель этой странички
Создание модели соударения шариков с помощью электронной таблицы
О.В. Туркин, Москва
В этой статье речь пойдет о создании компьютерной модели абсолютно упругого удара. Легко понять, что построение модели движения соударяющихся тел с использованием графики в любом языке программирования, даже в среде Visual Basic, достаточно сложная задача.
Использование электронной таблицы со встроенными средствами программирования, например Microsoft Excel с языком Visual Basic for Applications, позволяет, во-первых, осуществлять часть расчетов средствами самой электронной таблицы с оформлением диаграмм, а во-вторых, легко конструировать интерфейс программы с помощью различных свойств рабочего листа.
Итак, сначала о самой модели.
Как известно из школьного курса физики, при абсолютно упругом ударе двух тел массой M 1 и M 2 , движущихся соответственно со скоростями V 1 и V 2 , выполняются законы сохранения импульса
M1V1 + M2V2 = M1U1 + M2U2
и закона сохранения энергии
где U1 и U2 - скорости тел после соударения.
Совместное решение двух этих уравнений позволяет определить сначала значение скорости U 1
M1V12/2
+
M2V22/2
=
M1U12/2
+
M2U22/2
а затем и U2
U2 = V1 + U1 - V2
В нашей модели с помощью вышеприведенных формул будут рассчитываться координаты шариков, движущихся по одной прямой. Для того чтобы соударения происходили многократно, движения шариков ограничены боковыми стенками, при ударе о которые шарики изменяют свою скорость по направлению, сохраняя ее по величине.
Зададим необходимые для вычисления параметры в ячейках электронной таблицы.
Воспользуемся возможностью дать ячейкам уникальные имена. Для этого в первой строке, в ячейках А1:D1 соответственно, набираем имена ячеек, чтобы обозначить массы и начальные скорости каждого из шаров, а именно: mmm1, vvv1, mmm2, vvv2. После этого, выделив блок A1:D4, используем пункты меню "Вставка | Имя Создать | строке ниже" и присваиваем ячейкам A2:D2 эти имена. Сразу, чтобы не запутаться в дальнейшем, можно в ячейки А1:D1 ввести пояснения, например, "масса1", "скорость1" и т.д. (см. рисунок на с. 19).
В ячейки второй строки этого блока нужно ввести числовые значения. Массы шариков целесообразно выбрать в диапазоне от 1 до 10 кг, а скорости - в диапазоне от -10 до +10 м/с.
Теперь оформим блок E1:F2. В его вторую строку занесем начальные координаты шариков. Будем считать, что расстояние между ограничивающими стенками равно 10 метрам и, кроме того, шар 1 располагается левее шара 2, поэтому значение начальных координат равно соответственно 2 и 6. В ячейку G2 помещаем формулу - разность начальных координат первого и второго шариков. На этом создание области ввода закончено. Ее можно дополнительно оформить с помощью различных методов форматирования, снабдить примечаниями и т.д.
Переходим к созданию вычислительной области. Пусть эта область - A5:D5. Вписываем формулы - в A5 заносим =mmm1, в C5 - =mmm2. В четвертой строке (ячейки A4 и С4) поместим комментарии - "Первый шар", "Второй шар ". В ячейках B5 и D5 в дальнейшем будут отображаться координаты движущихся шариков. Пока туда можно записать те же значения, что содержатся в E2 и F2. Теперь все готово для построения диаграммы.
Построим диаграмму, в которой положение шариков будет зависеть от координат (то есть от значений в ячейках B5 и D5), а размеры - от массы (значения в ячейках A5 и C5). Для этого необходимо выбрать пузырьковую диаграмму.
Выделим диапазон A5:B5 и начнем работу с мастером диаграмм.
На первом шаге работы мастера выбираем тип диаграммы - пузырьковая.
На втором шаге, в окне "Ряд", определяем первый ряд (окно "Диапазон данных" пропускаем), для которого указываем значения X: =Лист1!$B$5, значения Y: 2 (вертикальная координата у шариков постоянна и меняться не будет) и размеры - =Лист1!$A$5. Сформировав ряд 1, добавляем ряд 2 с параметрами значения X: =Лист1!$D$5, значение Y: 2, размеры - =Лист1!$C$5.
На третьем шаге можно поместить заголовок диаграммы, отказаться от легенды и убрать ось Y.
На четвертом шаге размещаем диаграмму на "имеющемся листе 1".
Диаграмма с изображением двух шариков готова.
Используя возможности контекстного меню для диаграмм (области диаграммы, области построения и так далее), оформляем диаграмму по своему вкусу, но для оси Х необходимо установить минимальное и максимальное значения шкалы (соответственно 0 и 10), отказавшись от режима "Авто" для этих параметров. На диаграмму можно поместить объект "Надпись" с соответствующим тестом (как на рисунке).
Остановимся на этом этапе. До сих пор мы не обращались к языку программирования. В этом не было необходимости. Меняя вручную значения координат шариков или их массы в расчетном блоке (строка 5 таблицы), можно заставить шарики перемещаться по диаграмме. Но для того чтобы заставить шарики двигаться в автоматическом режиме, нужно написать небольшую программу.
Создадим управляющую (командную) кнопку. Для этого в пункте меню "Вид | Панели инструментов" отметим "Элементы управления". На появившейся панели элементов управления (ЭУ) нажимаем иконку "режима конструктора", находим иконку "Кнопка" и размещаем этот элемент управления на нашем рабочем листе.
Далее, с помощью иконки "Свойства" на панели ЭУ открываем окно свойств этой самой "Кнопки" и изменим внешний вид кнопки. Например, свойство Caption означает надпись на элементе. Заменим стандартную надпись "CommanButton1" на слово "Старт", также можно изменить стиль и цвет фона (BackStyle и BackColor), тип, размеры и цвет шрифта (Font и ForeColor). При этом сам элемент "Кнопка" должен быть выделен как объект. Вообще в области среды программирования VBA, в которой мы оказались, действуют свои правила, и надо быть достаточно осторожным.
Скажем, свойство Name лучше не менять.
Итак, кнопка имеет надпись "Старт", окрашена выбранным цветом, теперь нужно заставить ее заработать: шарики должны двигаться по диаграмме и при столкновении менять свои скорости в соответствии с нашими формулами.
Начинаем составлять программу. Дважды щелкнем по нашей красивой кнопке и начнем работу в окне исходного текста Visual Basic. В этот редактор также можно попасть через панель ЭУ (иконка "Исходный текст"), через ярлычок рабочего листа (та же иконка в контекстном меню) или через "Меню | Сервис | Макрос | Редактор:".
В окне уже есть две строки:
Private Sub CommandButton1_Click()
End Sub
В переводе - "локальная процедура (подпрограмма) для обработки щелчка по CommandButton1" и "конец процедуры". Между этими строчками и будет размещаться наш код. В первую очередь позаботимся о том, чтобы данные из ячеек ЭТ попали в переменные программы. Нам нужны начальные координаты шариков. Это ячейки E2 и F2 (строка 2, столбцы 5 и 6), поэтому две первые строчки будут выглядеть так:
xxn1 = Cells(2, 5)
xxn2 = Cells(2, 6)
В этих двух строчках происходит передача данных из ячеек (объекты из коллекции Cells) листа в переменные программы. Конкретные ячейки определяются через номер строки и номер столбца.
Теперь определимся со скоростями. Начальные скорости расположены в ячейках B2 и D2. В программе мы их обозначим через переменные dx1 и dx2. Координату шарика через промежуток времени t мы будем вычислять в соответствии с известной формулой физики
X = X 0 +Vot.
Полагаем t = 1/10, и тогда dx = V/10. Получаем следующие две строчки:
dx1 = Cells(2, 2) / 10
dx2 = Cells(2, 4) / 10
Очередные две строчки - это передача начальных координат в текущие координаты - переменные x1 и x2, которые будут использованы в цикле
x1 = xxn1
x2 = xxn2
Кроме того, в программе понадобятся и массы. Они располагаются в ячейках A2 и C2, поэтому
m1 = Cells(2, 1)
m2 = Cells(2, 3)
Теперь организуем цикл со стократным повторением, считая, что одно выполнение цикла соответствует 1/10 с, то есть процесс происходит в течение 10 условных секунд. При выбранных скоростях и расстояниях такое значение можно считать оптимальным.
For i = 1 To 100
Позаботимся, чтобы шарики не вылетали за стенки.
Первый шарик не должен улететь налево, и если он приблизился к левой стенке (ее координата равна 0), то величина его скорости должна поменять знак. Кроме того, чтобы зрительно шарик не пересекал стенку, запретим ему приближаться к ней ближе чем на 0,5.
Поэтому
If x1 <= 0.5 Then dx1 = Abs(dx1)
Для второго шарика опасна правая стенка с координатой 10, и с учетом его размеров получаем:
If x2 >= 9.5 Then dx2 = -1 * Abs(dx2)
Следующий шаг - это процесс соударения. Когда первый шарик (левый) приблизился ко второму менее чем на 1 (размеры шариков), то скорости шариков меняются в соответствии с формулами (1) и (2).
Попутно заметим, что если мы работаем в системе СИ, то шарики у нас - метровые гиганты. Вот такой супербоулинг!
If x1 >= x2 - 1# Then
a = dx1 'это скорость V1 перед ударом,
dx1 = (dx1 * (m1 - m2) + 2 * dx2 * m2) / _
(m1 + m2) 'скорость U1
dx2 = a + dx1 - dx2 'скорость U2
End If
Итак, значения скорости тел в случае соударений со стенками или друг с другом определены, теперь находим новые координаты через очередные 1/10 с.
x1 = x1 + dx1
x2 = x2 + dx2
Отправим эти значения в ЭТ, чтобы изменить диаграмму. Вспомним, что положение шариков в диаграмме определяется ячейками B5 и D5:
Cells(5, 2) = x1
Cells(5, 4) = x2
Следующая строка кода очень важна. Она дает команду электронной таблице произвести перерасчет в соответствии с новыми данными, а также перестроить диаграмму (перевод команды - "делай события").
DoEvents
Завершаем цикл:
Next i
Полностью код выглядит следующим образом.
Private Sub CommandButton1_Click()
xxn1 = Cells(2, 5)
xxn2 = Cells(2, 6)
dx1 = Cells(2, 2) / 10
dx2 = Cells(2, 4) / 10
x1 = xxn1
x2 = xxn2
m1 = Cells(2, 1)
m2 = Cells(2, 3)
For i = 1 To 100
If x1 <= 0.5 Then dx1 = Abs(dx1)
If x2 >= 9.5 Then dx2 = -1 * Abs(dx2)
If x1 >= x2 - 1# Then
a = dx1
dx1 = (dx1 * (m1 - m2) + 2 * dx2 * m2) / _
(m1 + m2)
dx2 = a + dx1 - dx2
End If
x1 = x1 + dx1
x2 = x2 + dx2
Cells(5, 2) = x1
Cells(5, 4) = x2
DoEvents
Next i
End Sub
Теперь вернемся в электронную таблицу, например, через значок таблицы в левом верхнем углу окна. Иконка "Режим конструктора" должна быть отжата, а ячейки во второй строке (начальные значения) должны быть заполнены. Не забудьте убрать выделение с диаграммы.
Щелкаем по кнопке "Старт" и любуемся.
Если программа не работает, то в Office2000 это может быть связано с режимом безопасности. Заходим в "Меню | Сервис | Макрос | Безопасность" и выбираем средний уровень безопасности. Сохраняем рабочую книгу, выходим из приложения и запускаем эту рабочую книгу опять, но теперь при загрузке на вопрос о включении макросов отвечаем, что макросы должны быть включены.
Проверить программу можно следующим образом: при равенстве масс тел и одинаковых по абсолютному значению, но противоположно направленных скоростях должна получиться симметричная картинка. Задаем начальные значения - массы по 5, скорости 5 и -5, начальные значения - 2,5 и 7,5. Получаем достаточно знакомую картину соударения двух одинаковых шаров с одинаковыми скоростями. Именно такой вариант изображен на рисунке.
Кроме того, во время работы программы можно заметить, что в ячейках пятой строки меняются значения. Это изменяются координаты шариков. При желании можно вывести в какие-нибудь ячейки и значения скоростей. Таким образом, ячейки таблицы играют роль ячеек памяти и позволяют наблюдать за изменением значений переменных, что полезно для анализа работы программ или ее отладки.
Как видим, для создания движущейся модели понадобилось не так уж и много времени, и за 2 часа с классом средней подготовки ее вполне можно реализовать. И еще раз хочется обратить внимание на то, что программный код был использован только тогда, когда появилась необходимость в динамических расчетах. Такое продуманное использование VBA действительно открывает широкие возможности для творчества.
В следующий раз мы рассмотрим проект, в котором строятся одновременно 3 графика изопроцесссов для идеальных газов с возможностью иллюстрации замкнутых газовых циклов. Эти процессы иллюстрируются диаграммой изменения количества теплоты, внутренней энергии и работы.